package util;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.util.WebUtils;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;

/**
 * JSON 工具类
 */
public class JsonUtil {
	private static final Gson gson = new GsonBuilder().disableHtmlEscaping().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
	private static Logger LOGGER = LoggerFactory.getLogger(JsonUtil.class);

	/**
	 * 将目标对象转化成 JSON 串
	 *
	 * @param src 目标对象
	 * @return String JSON 串
	 */
	public static String toJson(Object src) {
		if (src == null) {
			return "";
		}
		String s = "";
		try {
			s = gson.toJson(src);
		} catch (Exception e) {
			e.printStackTrace();

		}
		return s;
	}

	/**
	 * 将 JSON 串转化成目标对象
	 *
	 * @param json     能够产生 JSON 串的 Reader
	 * @param classOfT 目标对象类型
	 * @return T 目标对象
	 */
	public static <T> T fromJson(Reader json, Class<T> classOfT) {
		T r = null;
		try {
			r = gson.fromJson(json, classOfT);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return r;
	}

	/**
	 * 将 JSON 串转化成目标对象（默认UTF-8）
	 *
	 * @param json     JSON 串
	 * @param classOfT 目标对象类型
	 * @return T 目标对象
	 */
	public static <T> T fromJson(String json, Class<T> classOfT) {
		Charset charset = Charset.forName("UTF-8");
		return fromJson(json, classOfT, charset);
	}

	/**
	 * 将 JSON 串转化成目标对象
	 *
	 * @param json     JSON 串
	 * @param classOfT 目标对象类型
	 * @param charset  编码
	 * @return T 目标对象
	 */
	public static <T> T fromJson(String json, Class<T> classOfT, Charset charset) {
		if (json == null) {
			return null;
		}
		InputStream in = new ByteArrayInputStream(json.getBytes(charset));
		Reader reader = new InputStreamReader(in, charset);
		return fromJson(reader, classOfT);
	}

}
